package 数组;

/**
 * @Project: data-structure-and-algorithms
 * @Package: 数组
 * @ClassName: t1004_1
 * @Author: zhouyihe
 * @Date: 2025/11/26 14:07
 * @Description: 最大连续1的个数III--滑动窗口
 */
public class t1004_2 {

    /**
     * 找到数组中连续子数组的最大长度，使得该子数组中最多包含k个0（可以将这些0翻转为1）
     * 使用滑动窗口算法解决此问题
     *
     * @param nums 输入的二进制数组，只包含0和1
     * @param k    允许翻转的0的最大数量
     * @return 返回满足条件的最长连续子数组的长度
     */
    public int longestOnes(int[] nums, int k) {
        int n = nums.length;
        int left = 0, lsum = 0, rsum = 0;
        int ans = 0;

        // 滑动窗口遍历整个数组
        for (int right = 0; right < n; right++) {
            // 累计右侧窗口中0的数量（1-nums[right]表示如果是0则加1，如果是1则加0）
            rsum += 1 - nums[right];

            // 当窗口内0的数量超过k时，收缩左侧窗口
            while (lsum < rsum - k) {
                lsum += 1 - nums[left];
                ++left;
            }

            // 更新最大窗口长度
            ans = Math.max(ans, right - left + 1);
        }
        return ans;
    }


}
